package com.ruoyi.aitcommon.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ruoyi.aitcommon.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.ruoyi.aitcommon.config.ConfigInfoVO;
import com.ruoyi.aitcommon.config.ConfigManager;

import cn.hutool.core.util.StrUtil;

/**
 * 在SecurityConfig类中配置,跳过鉴权
 * @author Administrator
 *
 */
@RestController
@RequestMapping("/aitcommon/flow")
public class AitFlowController {
	@Autowired
	ConfigManager configManager;
	
	@PostMapping("/filesave")
	public JSONObject flowFileSave(@RequestBody Map<String,Object> fileinfo) {
		try {
			if(fileinfo==null)
				throw new Exception("传入参数为空!");
			Object path=fileinfo.get("filePath");
			if(StrUtil.isBlankIfStr(path))
				throw new Exception("参数filePath为空");
			Object text=fileinfo.get("fileText");
			if(StrUtil.isBlankIfStr(text))
				throw new Exception("参数fileText为空");
//			校验源文件
			if(path.toString().endsWith(".json")) {
				if(!JSONUtils.validJSONObjectStr(text.toString()))
					throw new Exception("JSON格式错误!");
			}
//			保存源文件
			FileUtils.writeFile(path.toString(), text.toString());
//			加载源文件
			configManager.reloadConfigByPath(path.toString());
			return JSONResult.success();
		}catch(Exception ex) {
			return JSONResult.error(ex.getMessage());
		}
	}
	
	/**
	 * 获取流程参数相关信息
	 * @param parmCode 就是flowCode
	 * @return 参数JSON,参数文本,参数Path等信息
	 */
	@GetMapping("/parminfo")
	public JSONObject flowParmInfo(String parmCode) {

		try {
			if(StrUtil.isBlank(parmCode))
				throw new Exception("传入parmCode为空");
			//第一个参数是flow,获取flow json文件配置内容
			Object value = configManager.getContextByParm(parmCode);
			String type=configManager.getContextTypeByPath(parmCode);
			ConfigInfoVO info = configManager.getConfigInfoByParm(parmCode);
			String fileText = FileUtils.readFileLines(info.getPath());
			if(value==null||type==null||info==null)
				throw new Exception("获取流程配置失败,路径:"+parmCode);
			
			if(type.equals("json")) {
				value=JSONObject.toJSONString(value, true);
			}
			
//			构造返回值
			Map<String,Object> retmap=new HashMap<String,Object>();
			retmap.put("type", type); //参数类型
			retmap.put("value", value); //参数内容
			retmap.put("fileName", info.getFilename()); //参数对应文件
			retmap.put("filePath", info.getPath()); //参数对应文件路径
			retmap.put("fileParm", info.getParmname()); //文件对应参数名称
			retmap.put("fileText", fileText);//源文件内容
			return JSONResult.success(retmap);
		}catch(Exception ex) {
			return JSONResult.error(ex.getMessage());
		}
	}
	
	/**
	 * 获取流程内部的变量清单
	 * @param flowCode 流程编码
	 * @return 变量清单列表
	 */
	@GetMapping("/parmlist")
	public JSONObject flowParmList(String flowCode) {

		try {
			if(StrUtil.isBlank(flowCode))
				throw new Exception("传入flowCode为空");
			//第一个参数是flow,获取flow json文件配置内容
			Object flowContent = configManager.getContextByParm(flowCode);
			if(flowContent==null)
				throw new Exception("获取流程配置失败,路径:"+flowCode);

			//获取flow内容中的变量${}
			List<String> names = JSONParamUtils.getJSONParamsName(flowContent.toString(), configManager.getContext());
			
//			处理返回值,只返回变量中是配置文件的变量,内部变量过滤掉
			List<String> retlist=new ArrayList<String>();
			for(String name:names) {
				if(configManager.isConfigParm(name))
					retlist.add(name);
			}
			return JSONResult.success(retlist);
		}catch(Exception ex) {
			return JSONResult.error(ex.getMessage());
		}
	}
}
